1. /* smmsize.cpp by K.Tsuru */
  2. /***************
  3. SNManager class
  4. ****************/
  5. #ifndef SN_H
  6. #include "sn.h"
  7. #endif
  8. uint SNManager::effFigures = defaultEffFig; //number of effective figures specified by user
  9. uint SNManager::hidden = defaultHidden; //number of hidden figures
  10. uint SNManager::maxArraySize = defaultMaxArraySize;
  11. uint SNManager::maxSize[SNManager::NUMBER_TYPE];
  12. bool SNManager::reduceMaxSize = ENABLE;
  13. void SNManager::SetMaxArraySize(uint s){
  14. if(s <= defaultMaxArraySize) return; // do nothing
  15. maxArraySize = ceilpow2(s);
  16. SetMaxSize();
  17. }
  18. // function ID = 002
  19. /**************************************************************************
  20. enum declared in "snum.h"
  21. number type SNumber::type;
  22. lower 1st bit:integer, 2nd bit:decimal, 3rd bit:BRADIX(binary radix)
  23. UNKNOWN is used in StringToNumber class.
  24. enum NumberType { MIN_SIZE = 0, INTEGER = 1, REAL = 2, DEC_RDX = 3,
  25. BIN_RDX = 4, BIN_INT = 5, BIN_DEC = 6, NUMBER_TYPE = 7, UNKNOWN = 8};
  26. **************************************************************************/
  27. void SNManager::SetMaxSize(){
  28. maxSize[MIN_SIZE]= minArraySize;
  29. maxSize[DEC_INT] = maxArraySize;
  30. maxSize[ REAL ] = SNEffFig(REAL) +Hidden()+ 1u;
  31. maxSize[DEC_RDX] = (uint)DRADIX;
  32. maxSize[BIN_RDX] = (uint)BRADIX;
  33. #ifndef NDEBUG
  34. assert(maxSize[REAL] > minArraySize);
  35. #endif
  36. double s = (double)DFIGURES*(double)maxArraySize/log10((double)BRADIX)+1.0; // ver.2.17
  37. maxSize[BIN_INT] = (uint)s;
  38. maxSize[BIN_DEC] = SNEffFig(BIN_DEC) +Hidden()+ 1u;
  39. }
  40. //function ID = 003
  41. //number of effective figures excluding figure[0]
  42. uint SNManager::SNEffFig(NumberType tp){
  43. #ifndef NDEBUG
  44. assert(tp & REAL);
  45. #endif
  46. static uint fig[2] = {0 , 0};
  47. uint f = effFigures;//number of effective figures specified by user
  48. if(fig[0] != f){ //evaluate again
  49. fig[0] = f;
  50. //Testing in 1/3.0 = 0.33333... the justice has been confirmed.
  51. f = uint( (double)f*(double)DFIGURES/log10((double)BRADIX) )+1u; // ver.2.17
  52. if( (f+Hidden()+1) & 1 ) f++; // f+hidden+1 = even
  53. fig[1] = f;
  54. }
  55. return (tp == REAL) ? fig[0] : fig[1];
  56. }
  57. // function ID = 007
  58. /*******************************************************************************
  59. Provides the number of hidden figures when the number of effective figures
  60. "eff_fig" is given.
  61. b = 9, m = 512, 1/512 = 0.2% or 8
  62. At least two figures are necessary in the judgement of convergence in Newton's
  63. method.
  64. *********************************************************************************/
  65. uint SNManager::HiddenSize(uint eff_fig){
  66. uint b = 9, m = 1 << (b+1), h;
  67. if(eff_fig < m) h = 2u;
  68. else h = eff_fig >> b;
  69. return min(h, 8u);
  70. }

smmsize.cpp : last modifiled at 2017/03/31 20:04:22(2,664 bytes)
created at 2016/04/11 11:36:47
The creation time of this html file is 2017/10/27 10:59:17 (Fri Oct 27 10:59:17 2017).